package com.mjf.io.output;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * ObjectOutput:完成对象的序列化
 *
 * 序列化：保存数据时，即保存数据的值又保存数据的数据类型
 * 反序列化：恢复数据时，即恢复数据的值又恢复数据的数据类型
 *
 * 类序列化，需要实现下面接口：
 *  -Serializable:标记接口，没有方法（推荐使用）
 *  -Externalizable：有方法需要实现
 *
 * 注意事项：
 *  1.读写顺序要一致
 *  2.序列化和反序列化的对象需要实现 Serializable 接口
 *  3.序列化的类型建议添加 SerialVersionUID,提高版本的兼容性
 *  4.序列化对象时，默认将所有属性都进行序列化，除了 static 与 transient 修饰的成员
 *  5.序列化对象时，要求属性的类型也需要实现序列化接口
 *  6.序列化具备可继承性。如果某类实现了序列化，则它的所有子类也默认实现了序列化
 */
public class ObjectOutputStreamUse {

    public static void main(String[] args) throws Exception {

        // 序列化后，保存的文件格式，不是纯文本，而是按照他的格式来保存
        String filePath = "D:\\coding\\idea\\java-stu\\output\\data.dat";

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

        oos.writeInt(100);  // int -> Integer (实现了 Serializable)
        oos.writeBoolean(true); // boolean -> Boolean (实现了 Serializable)
        oos.writeChar('a'); // char -> Character (实现了 Serializable)
        oos.writeDouble(9.5);   // double -> Double (实现了 Serializable)
        oos.writeUTF("你好"); // String
        // 保存一个dog对象
        oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
        oos.close();

    }
}
